| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import { NextRequest, NextResponse } from "next/server";
- import { getSupabaseAdminClient } from "@/lib/supabase/admin";
- import { getCurrentUser } from "@/lib/auth/current-user";
- import { deleteGroupAndData } from "@/lib/groups/delete-group";
- /** POST /api/groups/[id]/leave — Leave a group */
- export async function POST(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
- try {
- const { id } = await params;
- const user = await getCurrentUser(request);
- if (!user) {
- return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
- }
- const admin = getSupabaseAdminClient();
- const { data: membership } = await admin
- .from("group_members")
- .select("role")
- .eq("group_id", id)
- .eq("user_id", user.id)
- .maybeSingle();
- if (!membership) {
- return NextResponse.json({ error: "Not a member of this group" }, { status: 403 });
- }
- const { count } = await admin
- .from("group_members")
- .select("*", { count: "exact", head: true })
- .eq("group_id", id);
- const isLastMember = count === 1;
- // If admin with other members, must transfer first
- if (membership.role === "admin" && !isLastMember) {
- return NextResponse.json(
- { error: "Transfer admin role before leaving. Use /api/groups/[id]/transfer first." },
- { status: 400 },
- );
- }
- if (isLastMember) {
- await deleteGroupAndData(id);
- return NextResponse.json({ success: true, groupDeleted: true });
- }
- const { error } = await admin
- .from("group_members")
- .delete()
- .eq("group_id", id)
- .eq("user_id", user.id);
- if (error) {
- return NextResponse.json({ error: "Failed to leave group" }, { status: 500 });
- }
- return NextResponse.json({ success: true, groupDeleted: false });
- } catch {
- return NextResponse.json({ error: "Internal server error" }, { status: 500 });
- }
- }
|